package com.ltmonitor.thread;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import com.ltmonitor.service.IQueryService;
import com.ltmonitor.web.util.SpringApplicationContextHolder;

public class GetAlarmTimeLengthServiceThread extends BasicServiceThread {

	public GetAlarmTimeLengthServiceThread(String name, int sleepNum) {
		super(name, sleepNum);
	}
	
	@Resource
	private IQueryService queryService;
	
	
	private int limitAlarmNum = 100;//定义每次从数据库里获取的报警数据数量
	private int timeLength = 24;//定义获取报警的数据的时间
	
	private long showInfoTime = 4600;//定义输出时长时间
	
	
	
	//////////////////////////////////////////////////////////////////////////////线程运行相关
	
	// 初始化服务
	protected String threadServiceInit() {
		String msg = "";
		msg += initService();
		return msg;
	}
	
	String queryIdFind = "alarmTimeLengthThread.getStartAlarmData";//查找起点报警数据语句
	String queryIdUpdate = "alarmTimeLengthThread.updateOneStartAlarmData";//更新起点报警数据语句
	String queryIdDel = "alarmTimeLengthThread.deleteOneEndAlarmData";//删除终点报警数据语句
	//服务运行
	protected void threadServiceRun() {
		try {
			if(queryService != null) {
				long startTime = Calendar.getInstance().getTimeInMillis();//开始时间
				
				List alarmList = getAlarmData();
				if(alarmList != null) {
					if(alarmList.size() > 0) {
//						outInfo("获取到报警数据，报警数据数量为：" + alarmList.size());
						
						Map mapQu = new HashMap ();//定义更新查询所需map
						mapQu.put("status", 1);
						
						for(int i=0 ; i<alarmList.size();i++) {
							Map temp = (Map) alarmList.get(i);
							checkOneAlarmData(i,temp,mapQu);
						}//end for
						
						long endTime = Calendar.getInstance().getTimeInMillis();
						if(endTime - startTime > showInfoTime) {
							Map temp = (Map) alarmList.get(0);
							String startStr = "";
							if(temp.containsKey("alarmTime")) {
								startStr += " ， 起始时间为：" + temp.get("alarmTime").toString();
							}
							outInfo("本轮更新数据，报警数量为：" + alarmList.size() + startStr +  "  ， 耗时为：" + (endTime - startTime) + "  毫秒");							
						}
						
					}
					
				}
			}else {
				outInfo("数据库查询服务对象为null！");
				checkError();
			}
		} catch (Exception e) {
			// TODO: handle exception
			outError("线程执行失败：" + e.getMessage());
		}
	}
	
	//校验单个报警数据
	protected void checkOneAlarmData(int i ,Map temp , Map mapQu) {
		try {
			if(temp.containsKey("alarmId")) {
				
				//查询起点
				mapQu.put("alarmId", temp.get("alarmId"));
				mapQu.put("plateNo", temp.get("plateNo"));
				mapQu.put("endId", temp.get("id"));//终点数据id
				List listStart = queryService.query(queryIdFind, mapQu);
				//起点存在
				if(listStart != null && listStart.size() > 0) {
					Map start =  (Map)listStart.get(0);
					mapQu.put("alarmEndDate", temp.get("alarmTime"));
					mapQu.put("startId", start.get("id"));//起点数据id
					
//					String msg = "序号：" + i + " ，车牌号：" + mapQu.get("plateNo") + " alarmId= " + mapQu.get("alarmId") + " ， 起点Id = " + mapQu.get("startId") + "  ， 终点id = " + temp.get("endId");
//					outInfo(msg);
//					outInfo("开始更新起点数据.................");
					queryService.update(queryIdUpdate, mapQu);
//					outInfo("更新完成！");
//					outInfo("开始删除终点数据................");
					queryService.query(queryIdDel, mapQu);
//					outInfo("删除完成");
					
				}else {
					//起点不存在，删除终点
					String msg = "序号：" + i + " 当前数据无起点数据，车牌号：" + mapQu.get("plateNo") + "  alarmId= " + mapQu.get("alarmId") + "  ， 终点id = " + mapQu.get("endId") + " ，开始删除终点数据.....";
					outInfo(msg);
					queryService.query(queryIdDel, mapQu);
//					outInfo("删除完成!");
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
			outInfo("更新报警时长失败， 报警终点数据为：" + temp.toString() + " ， 失败原因：" + e.getMessage());
		}
	}
	
	//////////////////////////////////////////////////////////////////////////////功能相关
	
	private String queryIdAlarm = "alarmTimeLengthThread.selectAlarmTimeLengthDatas";
	
	//获取报警数据，根据时间
	private List getAlarmData(){
		List  list = null;
		try {
			//获取报警数量
			int limitNum = limitAlarmNum;
			int numTemp = Integer.valueOf(value1);
			if(numTemp > 0) {
				limitNum = numTemp;
			}
			
			//获取报警获取时间段
			int timeNum = timeLength;
			int timeTemp = Integer.valueOf(value2);
			if(timeTemp > 0) {
				timeNum = timeTemp;
			}
			Date endDate = new Date();
			Date startDate = new Date(endDate.getTime() - timeNum * 60 * 60 * 1000);
			Map map = new HashMap();
			map.put("limitNum", limitNum);
			map.put("alarmStatus", 2);
			map.put("startDate", startDate);
			map.put("endDate", endDate);

			list = queryService.query(queryIdAlarm, map);
			
		} catch (Exception e) {
			// TODO: handle exception
			String msg = "获取主动安全报警时长数据失败：" + e.getMessage();
			outError(msg);
		}
		
		return list;
	}
	
	
	
	
	//////////////////////////////////////////////////////////////////////////////初始化服务
	// 初始化所需服务
	private String initService() {
		String msg = "";
		
		outInfo("每次获取报警数据数量为：" + value1 + " ， 时间范围为：" +value2  + "  小时");
		
		if (queryService == null) {
			queryService = SpringApplicationContextHolder.getBean("queryService");
			if (queryService == null) {
				msg += "查询服务对象创建失败！";
			}
		}
		return msg;
	}
	

}
